In [ ]:
from PIL import Image, ImageEnhance
import numpy as np
import matplotlib.pyplot as plt
import cv2
import os
import pandas as pd

import requests
import json
import re
import csv

directory_path = os.getcwd()
parent_directory_path = os.path.dirname(directory_path)
csv_path = os.path.join(parent_directory_path, 'Model\\condo_data_new_FINAL_test.csv')
gt_masked_image_path = os.path.join(parent_directory_path, 'Model\\rd\\test')
generated_image_path = os.path.join(parent_directory_path, 'Model\\rd\\final_road_output_1') 

# Read the CSV file
data = pd.read_csv(csv_path)

# Function to extract the numeric part of the filename
def extract_numeric_part(filename):
    numeric_part = ''.join(filter(str.isdigit, filename))
    return int(numeric_part) if numeric_part else None

def create_binary_mask(arr, target_color, threshold=30):
    lower_bound = np.array(target_color) - threshold
    upper_bound = np.array(target_color) + threshold
    mask = (arr[:, :, :3] >= lower_bound) & (arr[:, :, :3] <= upper_bound)
    return np.all(mask, axis=-1)

def extract_building_regions(arr, target_color, threshold=10):
    lower_bound = np.array(target_color) - threshold
    upper_bound = np.array(target_color) + threshold
    mask = (arr[:, :, :3] >= lower_bound) & (arr[:, :, :3] <= upper_bound)
    return np.all(mask, axis=-1)

# def find_max_building_storeys(gpr):
#     max_building_storeys= 0
#     if gpr >= 0 and gpr < 1.4:
#         max_building_storeys = 5
#     elif gpr >= 1.4 and gpr < 1.6:
#         max_building_storeys = 12
#     elif gpr >= 1.6 and gpr < 2.1:
#         max_building_storeys = 24
#     elif gpr >= 2.1 and gpr < 2.8:
#         max_building_storeys = 36
#     elif gpr >= 2.8:
#         max_building_storeys = 48 ## by right got no limit
#     return max_building_storeys

def masked_rgb(simp_gpr):
    rgb = [0,0,0]
    if simp_gpr == 1.4:
        rgb = [0,255,0]
    elif simp_gpr == 1.6:
        rgb = [200,130,60]
    elif simp_gpr == 2.1:
        rgb = [0,0,0]
    elif simp_gpr == 2.8:
        rgb = [255,0,0]
    elif simp_gpr == 3.0:
        rgb =[0,0,255]
    return rgb

'''
pink, [255, 10, 169]
brown, [200,130,60]
cyan, [0,255,255]
red, [255,0,0]
black, [0,0,0]
green, [0,255,0]
blue, [0,0,255]
yellow, [255, 255, 0]
'''

absolute_accuracies = []
images =[]
sanity_ratio =[]

# Iterate through the images in the generated_image_path
for image_file in os.listdir(generated_image_path):
    if image_file.endswith('.png'):
        image_index = extract_numeric_part(image_file)

        # Construct the path for the corresponding masked image
        gt_mask_image_filename = f"{image_index}.png"
        gt_mask_image = os.path.join(gt_masked_image_path, gt_mask_image_filename)
        open_gt_mask_image = Image.open(gt_mask_image)
        mask_crop_box = (512, 0, 1024, 512) # right side
        mask_image = open_gt_mask_image.crop(mask_crop_box) #gt_mask is concatenated gt and mask
        gt_crop_box = (0, 0, 512, 512) # left side
        gt_image = open_gt_mask_image.crop(gt_crop_box)

        generated_image = os.path.join(generated_image_path, image_file)
        generated_image =  Image.open(generated_image)

        # Check if the image index matches any index in the CSV
        matched_row = data[data['key1'] == image_index]
        if not matched_row.empty:
            # Extract the GPR value for the matched row
            gpr_value = matched_row['GPR'].iloc[0]
            storey = matched_row['storeys'].iloc[0]
            simplified_gpr_value = matched_row['simp_gpr'].iloc[0]
            actual_site_area = matched_row['area'].iloc[0]
            actual_site_area = actual_site_area.replace(',', '')
            actual_site_area = float(actual_site_area[:-4])
            gpr_value = float(gpr_value)
            storey = int(storey)
            mask_array = np.array(mask_image)
            generated_array = np.array(generated_image)

            mask_color = masked_rgb(simplified_gpr_value)
            site_mask = create_binary_mask(mask_array, mask_color)
            site_area_array = generated_array.copy()
            site_area_array[~site_mask] = [255, 255, 255, 255] # making non-masked region white RMB ITS 4 CHANNELS NOW
            site_area_image = Image.fromarray(site_area_array)

            mask_color = [255, 10, 169] # pink
            building_mask = extract_building_regions(site_area_array, mask_color)
            buildings_image = Image.fromarray(building_mask)

            plt.figure(figsize=(20, 5))
            plt.subplot(1, 4, 1)
            plt.imshow(mask_image)
            plt.title('Mask Image')
            plt.axis('off')
            plt.subplot(1, 4, 2)
            plt.imshow(gt_image)
            plt.title('GT Image')
            plt.axis('off')
            plt.subplot(1, 4, 3)
            plt.imshow(generated_image)
            plt.title('Generated Image')
            plt.axis('off')
            plt.subplot(1, 4, 4)
            plt.imshow(buildings_image, cmap='gray')
            plt.title('Buildings Image')
            plt.axis('off')
            plt.show()

            # accuracy
            building_pixels = np.sum(building_mask)
            mask_pixels = np.sum(site_mask)
            msq_per_pixel = actual_site_area/mask_pixels
            building_area = msq_per_pixel * building_pixels
            #max_storeys = find_max_building_storeys(gpr_value)
            generated_gpr = building_area*storey/actual_site_area
            if generated_gpr == 0:
                accuracy = 0
            else:
                accuracy = (gpr_value - generated_gpr) / gpr_value #gpr_value is the target gpr
            images.append(image_file)
            absolute_accuracy = abs(accuracy)
            absolute_accuracies.append(absolute_accuracy)
            print(f'Image: {image_file}, GPR: {gpr_value}, Simplified GPR: {simplified_gpr_value}, Storeys:{storey},  Site area: {actual_site_area}, Building pixels: {building_pixels}, Mask pixels: {mask_pixels}, Generated GPR: {generated_gpr}')

            #sanity check. ratios should be about 0.75
            ratio = mask_pixels/actual_site_area
            sanity_ratio.append(ratio)

print(f"Absolute accuracies: {absolute_accuracies}")
print('Images: ', images)
print(f"Sanity Ratio: {sanity_ratio}")

total_data = len(absolute_accuracies)
model_accuracy = sum(absolute_accuracies)/total_data
print(f"\nAccuracy for rd data: {model_accuracy}")
No description has been provided for this image
Image: 1040.png, GPR: 1.4, Simplified GPR: 1.4, Storeys:5,  Site area: 23065.1, Building pixels: 4990, Mask pixels: 16203, Generated GPR: 1.5398383015490957
No description has been provided for this image
Image: 1074.png, GPR: 2.5, Simplified GPR: 2.8, Storeys:12,  Site area: 37265.0, Building pixels: 3559, Mask pixels: 27286, Generated GPR: 1.5651982701751814
No description has been provided for this image
Image: 1076.png, GPR: 2.8, Simplified GPR: 2.8, Storeys:36,  Site area: 10414.2, Building pixels: 1021, Mask pixels: 8468, Generated GPR: 4.340576287198867
No description has been provided for this image
Image: 1102.png, GPR: 1.6, Simplified GPR: 1.6, Storeys:12,  Site area: 6157.3, Building pixels: 1631, Mask pixels: 4749, Generated GPR: 4.121288692356286
No description has been provided for this image
Image: 1180.png, GPR: 3.0, Simplified GPR: 3.0, Storeys:15,  Site area: 19547.0, Building pixels: 2102, Mask pixels: 14230, Generated GPR: 2.2157413914265636
No description has been provided for this image
Image: 1379.png, GPR: 1.4, Simplified GPR: 1.4, Storeys:5,  Site area: 17455.9, Building pixels: 4610, Mask pixels: 12216, Generated GPR: 1.8868696791093647
No description has been provided for this image
Image: 145.png, GPR: 2.8, Simplified GPR: 2.8, Storeys:15,  Site area: 22094.4, Building pixels: 2196, Mask pixels: 16171, Generated GPR: 2.0369797786160415
No description has been provided for this image
Image: 1484.png, GPR: 3.0, Simplified GPR: 3.0, Storeys:17,  Site area: 10097.1, Building pixels: 1244, Mask pixels: 7571, Generated GPR: 2.793290186236957
No description has been provided for this image
Image: 1602.png, GPR: 3.0, Simplified GPR: 3.0, Storeys:17,  Site area: 13564.8, Building pixels: 1756, Mask pixels: 9875, Generated GPR: 3.022987341772151
No description has been provided for this image
Image: 1655.png, GPR: 2.1, Simplified GPR: 2.1, Storeys:18,  Site area: 27418.2, Building pixels: 3175, Mask pixels: 21711, Generated GPR: 2.6323062042282714
No description has been provided for this image
Image: 1670.png, GPR: 2.8, Simplified GPR: 2.8, Storeys:13,  Site area: 17940.2, Building pixels: 1520, Mask pixels: 11713, Generated GPR: 1.6870144284128745
No description has been provided for this image
Image: 1796.png, GPR: 2.8, Simplified GPR: 2.8, Storeys:17,  Site area: 13877.2, Building pixels: 1192, Mask pixels: 9260, Generated GPR: 2.1883369330453566
No description has been provided for this image
Image: 1811.png, GPR: 1.4, Simplified GPR: 1.4, Storeys:5,  Site area: 7255.7, Building pixels: 2095, Mask pixels: 5237, Generated GPR: 2.0001909490166128
No description has been provided for this image
Image: 1876.png, GPR: 2.1, Simplified GPR: 2.1, Storeys:19,  Site area: 10502.8, Building pixels: 1474, Mask pixels: 8220, Generated GPR: 3.4070559610705593
No description has been provided for this image
Image: 191.png, GPR: 3.5, Simplified GPR: 3.0, Storeys:18,  Site area: 13000.3, Building pixels: 2180, Mask pixels: 9133, Generated GPR: 4.29650717179459
No description has been provided for this image
Image: 2000.png, GPR: 3.0, Simplified GPR: 3.0, Storeys:17,  Site area: 13241.8, Building pixels: 2103, Mask pixels: 9581, Generated GPR: 3.7314476568207913
No description has been provided for this image
Image: 434.png, GPR: 2.1, Simplified GPR: 2.1, Storeys:16,  Site area: 39401.6, Building pixels: 3629, Mask pixels: 28557, Generated GPR: 2.0332667997338656
No description has been provided for this image
Image: 489.png, GPR: 2.1, Simplified GPR: 2.1, Storeys:15,  Site area: 28692.65, Building pixels: 2616, Mask pixels: 20400, Generated GPR: 1.923529411764706
No description has been provided for this image
Image: 491.png, GPR: 3.0, Simplified GPR: 3.0, Storeys:16,  Site area: 18747.8, Building pixels: 1892, Mask pixels: 12952, Generated GPR: 2.3372452130945027
No description has been provided for this image
Image: 568.png, GPR: 3.4, Simplified GPR: 3.0, Storeys:19,  Site area: 14344.0, Building pixels: 1877, Mask pixels: 10424, Generated GPR: 3.42123944742901
Absolute accuracies: [0.09988450110649702, 0.37392069192992744, 0.5502058168567383, 1.5758054327226785, 0.2614195361911455, 0.3477640565066891, 0.27250722192284227, 0.06890327125434774, 0.007662447257383705, 0.2534791448706054, 0.39749484699540194, 0.21845109534094403, 0.42870782072615204, 0.62240760050979, 0.22757347765559718, 0.24381588560693043, 0.03177771441244499, 0.08403361344537817, 0.22091826230183242, 0.0062468963026500865]
Images:  ['1040.png', '1074.png', '1076.png', '1102.png', '1180.png', '1379.png', '145.png', '1484.png', '1602.png', '1655.png', '1670.png', '1796.png', '1811.png', '1876.png', '191.png', '2000.png', '434.png', '489.png', '491.png', '568.png']
Sanity Ratio: [0.7024899089967094, 0.7322152153495237, 0.8131205469455166, 0.7712796193136602, 0.7279889497109531, 0.6998206909984589, 0.7319049170830617, 0.7498192550336235, 0.7279871431941496, 0.7918462918791168, 0.6528912721151381, 0.667281584181247, 0.7217773612470196, 0.7826484366073809, 0.7025222494865504, 0.7235421166306696, 0.724767522131081, 0.7109834748620291, 0.6908543935821804, 0.7267150027886224]

Accuracy for rd data: 0.3146489666957988